package bean.dao;

import java.util.List;
import hbt.HibernateUtil;
import org.hibernate.*;
import bean.*;


public class CotizacionDAO {
	private static CotizacionDAO instancia = null;
	private static SessionFactory sf = null;

	public static CotizacionDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new CotizacionDAO();
		} 
		return instancia;
	}
	
	public Cotizacion buscarCotizacion(int num){
		Cotizacion cot = new Cotizacion();
		Session session = sf.openSession();
		Query query = session.createQuery("from Cotizacion c where (c.numCot=:numero)");
		query.setParameter("numero", num);
		cot = (Cotizacion) query.uniqueResult();
		session.close();
		return cot;
	}
		
	/*busca el item con mejor precio entre las listas de proveedores de acuerdo a idProducto*/
	@SuppressWarnings("unchecked")
	public Item_ListaPrecios buscarMejorPrecio(String nroSerie, String sufijo){
		Session session = sf.openSession();
		Query query = session.createQuery("from Item_ListaPrecios i where (i.producto.idProducto.nroSerie =:nroSerie) order by i.precioUnitario");
		query.setString("nroSerie",nroSerie);
		List <Item_ListaPrecios> items = query.setMaxResults(1).list();
		session.close();
		return items.get(0);
	}
	
	public Cotizacion generarCotizacionSolicitud(int numero, String fecha){
		Cotizacion cotizacion = new Cotizacion();
		cotizacion.setFechaGenerado(FechaDAO.getInstancia().getFechaActual());
		SolicitudDeCotizacion solicitud = new SolicitudDeCotizacion();
		solicitud =	SolicitudDAO.getInstancia().buscarSolicitud(numero, fecha);
		cotizacion.setSolicitud(solicitud); 
		Session session = sf.openSession();
		session.beginTransaction();
		session.persist(cotizacion);
		/*busco llenar los items de la cotizacion con el mejor precio*/
		List <Item_SolicitudCliente> itemsSolicitud = SolicitudDAO.getInstancia().buscarItemsSolicitud (numero,fecha);
		for (int i =0; i<itemsSolicitud.size();i++){
			Item_Cotizacion itemCot = new Item_Cotizacion();
			itemCot.setCantidad(itemsSolicitud.get(i).getCantidad());
			itemCot.setCotizacion(cotizacion);
			itemCot.setProducto(itemsSolicitud.get(i).getProducto());
			Item_ListaPrecios item = buscarMejorPrecio (itemsSolicitud.get(i).getProducto().getId().getNroSerie(),itemsSolicitud.get(i).getProducto().getId().getSufijo());
			itemCot.setPrecio(item.getPrecioUnitario());
			itemCot.setListaDePrecio(item.getLista());
			session.persist(itemCot);			
		}
		session.flush();
		session.getTransaction().commit();
		session.close();
		return cotizacion;
	}
	
	@SuppressWarnings("unchecked")
	public List <Item_Cotizacion> buscarItemsCotizacion (int num){
		Session session = sf.openSession();
		List <Item_Cotizacion> itemsCotizacion;
		Query query = session.createQuery("from Item_Cotizacion i where (i.cotizacion.numCot =:numero)");
		query.setParameter("numero", num);
		itemsCotizacion = query.list();
		session.close();
		return itemsCotizacion;
	}
}
